(function () {
  // 定义一个表示人的类
  class Person {
    // TS 可以在属性前添加属性的修饰符
    private _name: string;
    private _age: number;

    constructor(name: string, age: number) {
      this._name = name;
      this._age = age;
    }
    // 通过公共的方法读取(修改)属性值
    /* getName() {
      return this.name;
    }
    setName(name: string) {
      this.name = name;
    }
    getAge() {
      return this.age;
    }
    setAge(age: number) {
      if (age >= 0) {
        this.age = age;
      }
    } */

    // TS中设置getter方法的方式
    get name() {
      // 获取name属性时自动调用
      return this._name;
    }
    set name(value: string) {
      // 修改name属性时自动调用
      this._name = value;
    }
    get age() {
      return this._age;
    }
    set age(value: number) {
      if (value >= 0) {
        this._age = value;
      }
    }
  }

  const per = new Person("张三", 18);
  console.log(per); // Person { name: '张三', age: 18 }
  // 现在属性是在对象中设置的，属性可以任意的修改,将会导致对象中的数据变得不安全
  // per.name = "李四"; // // 警告：属性name为私有属性 只能在类的内部访问
  // per.age = -20; // // 警告：属性name为私有属性 只能在类的内部访问
  console.log(per); // Person { name: '张三', age: 18 }
  // console.log(per.name); // 警告：属性name为私有属性 只能在类的内部访问
  /* console.log(per.getName());
  per.setName("李四");
  console.log(per.getName());
  per.setAge(-18);
  console.log(per.getAge()); //18 */

  // console.log(per._name); // 警告：name为私有属性 只能在类的内部访问
  console.log(per.name, per.age); // 张三 18
  per.name = "李四";
  per.age = -20;
  console.log(per.name, per.age); // 李四 18
})();
